/**
 * 当定义大量数字或字符时，比如100个数字或200个字符串，显然定义100个变量不合适，这个时候就用到数组了、
 * 数组时相同类型数据的有序集合，可以存放任一相同类型数据，包括引用类型和基本类型，比如都是int或都是double
 * 下标从0开始，10个数据则是0-9，每个数据称为元素
 * 使用new关键字创建，[]来表示，数组也是类，但对java不可见，C++写的，不是基本类型
 * 使用定义的数组对象后面打.号，会出来很多成员方法，说明是类，不是基本类型
 */
package com.test.array;

import com.sun.org.apache.bcel.internal.generic.DCMPG;

public class Main {
    public static void main(String[] args) {
        //数组创建的几种方式，需要new关键字来创建
        int[] a = new int[10]; //必须指定长度或直接指定数组每个元素值
        System.out.println(a.length);  //数组有成员变量
        System.out.println(a.toString());   //数组有成员方法

        //一维数组，元素一次排列，就像只有一行一样理解，每个元素通过下标访问
        int[] intarr = new int[10];  //数组类型[] 变量名 = new 数组类型[长度必须写]，动态初始化
        int intintarray[]  = new int[10];  //类C语言写法，不建议这么写。里面的元素没有初始默认值，必须自己指定值，否则不知道是什么值了
        String[] str = new String[]{"ba", "ca", "da"}; //直接指定了数组元素值，长度也固定了，[]里面不写长度了，静态初始化
        // 注意String类型必须用双引号表示string，单引号是char
        String[] str2 = new String[4]; //同上，更简略的方式，静态初始化

        Double[] dstr;
        dstr = new Double[]{1.2, 3.4, 5.6};  //另一种写法，动态初始化

        //数组的元素默认值和基本类型及String类型的初始值是一样的，int默认是0，String引用类型默认是null
        System.out.println(intarr[0]);
        System.out.println(str2[1]);
        System.out.println(intintarray[1]);

        //数组创建后，长度不可变，是final类型，使用length指定长度会报错;越界访问也会报错
//        a.length = 20;  //Cannot assign a value to final variable 'length'
//        System.out.println(a[10]);  //ArrayIndexOutOfBoundsException
        //如果想扩容，只能另外创建一个更大的数组，把值复制过去。

        //数组做实参的话，因为数组也是类，所以传给形参的是数组本身的引用，而不是像基本类型一样复制了一个值过去，方法内部操作的是数组本身
        int[] b = new int[]{4,7,0};
        test(b);  //形参传递给test()方法，传递的是数组对象本身
         System.out.println(b[0]);

         //数组的遍历，一个一个下标打印太麻烦，使用for循环或for each循环
        for (int i = 0; i < dstr.length; i++) {
            System.out.println(dstr[i]);
        }

        for (Double i:dstr) {  //这里的i就不是用来计数的下标了，而是依次代表dstr的每个元素，所以后面直接打印i就可以了
            System.out.println(i);  //方便，但坏处是没法精确指定某个元素
        }

        for (int i: intintarray) {
            System.out.println(i);
        }
    }

    private static void test(int[] arr){
        arr[0] = 100;  //这里对传入的形参进行修改，修改的是对象本身
    }
}
